package com.ntd.study.base.type.arrays;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * list 集合相关内容 - 可重复、有序
 * ArrayList：线程不安全、扩容50%
 * LinkedList：线程不安全
 * Vector：线程安全、扩容100%
 */
public class ListDemo {
    /**
     * 列表类型接口
     * 继承自 Collection
     * List用于存放多个元素，能够维护元素的次序，并且允许元素的重复
     * 有序，可重复，长度可变
     */

    List list;
    /**
     * 抽象列表类型
     * 继承 AbstractCollection
     * 实现 list
     */
    AbstractList abstractList;

    /**
     * 向量类型
     * 继承 AbstractList
     * 实现 List, RandomAccess, Cloneable, Serializable 等接口
     * vector和数组类似，拥有一段连续的内存空间，并且起始地址不变
     * 因此，它能够高效地进行随机存取，时间复杂度是O(1)。
     * 但是，因为其内存空间是连续的，所以在进行插入和删除操作时，会造成内存块的拷贝，因此时间复杂度为O(n)。
     * 另外，当数组内存空间不够时，会重新申请一块内动空间并进行内存拷贝
     * Vector 同步的-线程安全
     */
    Vector vector;

    /**
     * 栈
     * 继承 Vector
     * 1.标准的后进先出
     * 特有方法
     * peek：获取栈顶对象，但不从栈中移除
     * pop：获取栈顶对象，并从栈顶移除
     * push：将对象压入栈中
     * 只有默认的空参构造方法
     */
    Stack stack;

    /**
     * ArrayList
     * 1.内部数组实现
     * 2.适合随机查找和遍历，不适合插入和删除
     */
    ArrayList arrayList = new ArrayList<>();

    /**
     * linkedList 专用接口
     * ListIterator 要求子类必须实现的迭代器
     */
    AbstractSequentialList abstractSequentialList;

    /**
     * LinkedList
     * 继承 AbstractSequentialList
     * 实现 List<E>, Deque<E>, Cloneable, Serializable
     * 使用迭代器（iterator）获取元素，执行大量增删操作，不需要考虑扩充时重新分配数组大小
     * 1.链表结构存储数据
     * 2.适合动态的插入和删除
     * 3.提供了表头表尾操作方法，可以用于堆、栈、队列、双向队列使用
     * 里面存储了 表开头，表结尾-Node对象
     * 每个节点是一个内部node 每个node存储了上一个节点和下一个节点
     */
    LinkedList<String> linkedList = new LinkedList<>();

    /**
     * 线程安全的arrayList
     */
    CopyOnWriteArrayList copyOnWriteArrayList;
}
